package com.yugao.fintech.antelope.auth.model.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.yugao.fintech.antelope.base.datasource.core.type.StringListTypeHandler;
import com.yugao.fintech.antelope.base.model.BasePlusPO;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.validation.constraints.NotBlank;
import java.util.List;

/**
 * 因为roleIds是以json序列号的方式存入到数据库中, 所以必须设置 autoResultMap = true, 查询的时候才会
 * 自动映射出来, 否则roLeIds查询结果为空

 */
@Getter
@Setter
@ToString
@TableName(value = "auth_oauth2_client", autoResultMap = true)
//@DataIsolation(filterMainTenant = true, tableName = "auth_oauth2_client")
public class OAuth2Client extends BasePlusPO {
    private static final long serialVersionUID = 1L;

    /**
     * 客户端ID
     */
    @NotBlank(message = "id 不能为空")
    @TableId(value = "id")
    private Long id;

    /**
     * 客户端名称
     */
    private String name;

    /**
     * 客户端id
     */
    private String clientId;

    /**
     * 客户端密钥
     */
    @NotBlank(message = "client_secret 不能为空")
    private String clientSecret;

    /**
     * 资源ID
     */
    private String resourceIds;

    /**
     * 作用域
     */
    @NotBlank(message = "scope 不能为空")
    @TableField(typeHandler = StringListTypeHandler.class)
    private List<String> scope;

    /**
     * 授权方式（A,B,C）
     */
    @TableField(typeHandler = StringListTypeHandler.class)
    private List<String> authorizedGrantTypes;

    /**
     * 扩展授权方式, 专只外部身份源码
     * @see ExtLdpConnect#getGrantType()
     */
    private String extGrantTypes;

    /**
     * 回调地址
     */
    private String webServerRedirectUri;

    /**
     * 权限
     */
    private String authorities;

    /**
     * 请求令牌有效时间
     */
    private Integer accessTokenValidity;

    /**
     * 刷新令牌有效时间
     */
    private Integer refreshTokenValidity;

    /**
     * 扩展信息
     */
    private String additionalInformation;

    /**
     * 是否自动放行
     */
    private String autoApprove;

    /**
     * 是否允许同时在线
     * @see cn.hutool.core.util.BooleanUtil#toBooleanObject(String)
     */
    private String canSameTimeOnline;

    /**
     * 是否使用验证码
     * @see cn.hutool.core.util.BooleanUtil#toBooleanObject(String)
     */
    private String useCaptcha;

    /**
     * 登录失败次数, 当登录失败达到一定次数之后, 就会被锁定 <br/>
     * -1则不限制
     */
    private Integer loginFailCount;

    /**
     * 锁定间隔(单位为秒)
     */
    private Integer lockInterval;

    /**
     * 连续被锁定时间乘子, 下一次锁定的时间 = 连续被锁定次数 * 锁定间隔 * 锁定时间乘子
     */
    private Integer lockMultiplier;

    /**
     * 角色ids ["1231", "3434"]
     */
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private List<Long> roleIds;

    /**
     * 应用类型
     * @see com.yugao.fintech.antelope.base.model.constants.AppType
     */
    private String appType;

    public static LambdaQueryWrapper<OAuth2Client> lqw() {
        return Wrappers.lambdaQuery();
    }
}
